home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / mint / mint96sb.zoo / doc / filesys.h < prev    next >
C/C++ Source or Header  |  1992-10-15  |  15KB  |  476 lines

  1. /*
  2.  * NOTE: This file only works if sizeof(int) == 2!
  3.  * UNLESS: you have an ANSI compiler and use prototypes
  4.  *
  5.  * Copyright 1991,1992 Eric R. Smith. This file may be re-distributed
  6.  * as long as this notice remains intact.
  7.  */
  8.  
  9. #ifndef _filesys_h
  10. #define _filesys_h
  11.  
  12. #ifndef P_
  13. # ifdef __STDC__
  14. #  define P_(x) x
  15. # else
  16. #  define P_(x) ()
  17. # endif
  18. #endif
  19.  
  20. #ifdef _SHORTINT
  21. #define _wORD int
  22. #endif
  23.  
  24. #ifndef _wORD
  25. #ifdef __MSHORT__        /* 16 bit integers? */
  26. #define _wORD int
  27. #else
  28. #define _wORD short
  29. #endif
  30. #endif
  31.  
  32. #define NAME_MAX 32
  33. #define PATH_MAX 128
  34.  
  35. struct filesys;        /* forward declaration */
  36. struct devdrv;        /* ditto */
  37.  
  38. typedef struct f_cookie {
  39.     struct filesys *fs;    /* filesystem that knows about this cookie */
  40.     unsigned short    dev;        /* device info (e.g. Rwabs device number) */
  41.     unsigned short    aux;        /* extra data that the file system may want */
  42.     long    index;        /* this+dev uniquely identifies a file */
  43. } fcookie;
  44.  
  45. /* structure for opendir/readdir/closedir */
  46. typedef struct dirstruct {
  47.     fcookie fc;        /* cookie for this directory */
  48.     unsigned short    index;        /* index of the current entry */
  49.     unsigned short    flags;        /* flags (e.g. tos or not) */
  50. #define TOS_SEARCH    0x01
  51.     char    fsstuff[60];    /* anything else the file system wants */
  52.                 /* NOTE: this must be at least 45 bytes */
  53. } DIR;
  54.  
  55. /* structure for getxattr */
  56. typedef struct xattr {
  57.     unsigned short    mode;
  58. /* file types */
  59. #define S_IFMT    0170000        /* mask to select file type */
  60. #define S_IFCHR    0020000        /* BIOS special file */
  61. #define S_IFDIR    0040000        /* directory file */
  62. #define S_IFREG 0100000        /* regular file */
  63. #define S_IFIFO 0120000        /* FIFO */
  64. #define S_IMEM    0140000        /* memory region or process */
  65. #define S_IFLNK    0160000        /* symbolic link */
  66.  
  67. /* special bits: setuid, setgid, sticky bit */
  68. #define S_ISUID    04000
  69. #define S_ISGID 02000
  70. #define S_ISVTX    01000
  71.  
  72. /* file access modes for user, group, and other*/
  73. #define S_IRUSR    0400
  74. #define S_IWUSR 0200
  75. #define S_IXUSR 0100
  76. #define S_IRGRP 0040
  77. #define S_IWGRP    0020
  78. #define S_IXGRP    0010
  79. #define S_IROTH    0004
  80. #define S_IWOTH    0002
  81. #define S_IXOTH    0001
  82. #define DEFAULT_DIRMODE (0777)
  83. #define DEFAULT_MODE    (0666)
  84.     long    index;
  85.     unsigned short    dev;
  86.     unsigned short    reserved1;
  87.     unsigned short    nlink;
  88.     unsigned short    uid;
  89.     unsigned short    gid;
  90.     long    size;
  91.     long    blksize, nblocks;
  92.     short    mtime, mdate;
  93.     short    atime, adate;
  94.     short    ctime, cdate;
  95.     short    attr;
  96.     short    reserved2;
  97.     long    reserved3[2];
  98. } XATTR;
  99.  
  100. typedef struct fileptr {
  101.     short    links;        /* number of copies of this descriptor */
  102.     unsigned short    flags;        /* file open mode and other file flags */
  103.     long    pos;        /* position in file */
  104.     long    devinfo;    /* device driver specific info */
  105.     fcookie    fc;        /* file system cookie for this file */
  106.     struct devdrv *dev; /* device driver that knows how to deal with this */
  107.     struct fileptr *next; /* link to next fileptr for this file */
  108. } FILEPTR;
  109.  
  110. /* lock structure */
  111. struct flock {
  112.     short l_type;            /* type of lock */
  113. #define F_RDLCK        O_RDONLY
  114. #define F_WRLCK        O_WRONLY
  115. #define F_UNLCK        3
  116.     short l_whence;            /* SEEK_SET, SEEK_CUR, SEEK_END */
  117.     long l_start;            /* start of locked region */
  118.     long l_len;            /* length of locked region */
  119.     short l_pid;            /* pid of locking process
  120.                         (F_GETLK only) */
  121. };
  122.  
  123. /* LOCK structure used by the kernel internally */
  124.  
  125. typedef struct ilock {
  126.     struct flock l;
  127.     struct ilock *next;
  128.     long  reserved[4];
  129. } LOCK;
  130.  
  131. typedef struct devdrv {
  132.     long (*open)    P_((FILEPTR *f));
  133.     long (*write)    P_((FILEPTR *f, char *buf, long bytes));
  134.     long (*read)    P_((FILEPTR *f, char *buf, long bytes));
  135.     long (*lseek)    P_((FILEPTR *f, long where, _wORD whence));
  136.     long (*ioctl)    P_((FILEPTR *f, _wORD mode, void *buf));
  137.     long (*datime)    P_((FILEPTR *f, _wORD *timeptr, _wORD rwflag));
  138.     long (*close)    P_((FILEPTR *f, _wORD pid));
  139.     long (*select)    P_((FILEPTR *f, long proc, _wORD mode));
  140.     void (*unselect) P_((FILEPTR *f, long proc, _wORD mode));
  141.     long    reserved[3];    /* reserved for future use */
  142. } DEVDRV;
  143.  
  144. typedef struct filesys {
  145.     struct    filesys    *next;    /* link to next file system on chain */
  146.     long    fsflags;
  147. #define FS_KNOPARSE    0x01    /* kernel shouldn't do parsing */
  148. #define FS_CASESENSITIVE    0x02    /* file names are case sensitive */
  149. #define FS_NOXBIT    0x04    /* if a file can be read, it can be executed */
  150.  
  151.     long    (*root) P_((_wORD drv, fcookie *fc));
  152.     long    (*lookup) P_((fcookie *dir, char *name, fcookie *fc));
  153.     long    (*creat) P_((fcookie *dir, char *name, unsigned _wORD mode,
  154.                 _wORD attrib, fcookie *fc));
  155.     DEVDRV *(*getdev) P_((fcookie *fc, long *devspecial));
  156.     long    (*getxattr) P_((fcookie *fc, XATTR *xattr));
  157.     long    (*chattr) P_((fcookie *fc, _wORD attr));
  158.     long    (*chown) P_((fcookie *fc, _wORD uid, _wORD gid));
  159.     long    (*chmode) P_((fcookie *fc, unsigned _wORD mode));
  160.     long    (*mkdir) P_((fcookie *dir, char *name, unsigned _wORD mode));
  161.     long    (*rmdir) P_((fcookie *dir, char *name));
  162.     long    (*remove) P_((fcookie *dir, char *name));
  163.     long    (*getname) P_((fcookie *relto, fcookie *dir, char *pathname));
  164.     long    (*rename) P_((fcookie *olddir, char *oldname,
  165.                 fcookie *newdir, char *newname));
  166.     long    (*opendir) P_((DIR *dirh, _wORD tosflag));
  167.     long    (*readdir) P_((DIR *dirh, char *nm, _wORD nmlen, fcookie *fc));
  168.     long    (*rewinddir) P_((DIR *dirh));
  169.     long    (*closedir) P_((DIR *dirh));
  170.     long    (*pathconf) P_((fcookie *dir, _wORD which));
  171.     long    (*dfree) P_((fcookie *dir, long *buf));
  172.     long    (*writelabel) P_((fcookie *dir, char *name));
  173.     long    (*readlabel) P_((fcookie *dir, char *name, _wORD namelen));
  174.     long    (*symlink) P_((fcookie *dir, char *name, char *to));
  175.     long    (*readlink) P_((fcookie *dir, char *buf, _wORD len));
  176.     long    (*hardlink) P_((fcookie *fromdir, char *fromname,
  177.                 fcookie *todir, char *toname));
  178.     long    (*fscntl) P_((fcookie *dir, char *name, _wORD cmd, long arg));
  179.     long    (*dskchng) P_((_wORD drv));
  180.     long    zero;
  181. } FILESYS;
  182.  
  183. /*
  184.  * this is the structure passed to loaded file systems to tell them
  185.  * about the kernel
  186.  */
  187.  
  188. typedef long (*_LongFunc)();
  189.  
  190. struct kerinfo {
  191.     short    maj_version;    /* kernel version number */
  192.     short    min_version;    /* minor kernel version number */
  193.     unsigned short default_mode;    /* default file access mode */
  194.     short    reserved1;    /* room for expansion */
  195.  
  196. /* OS functions */
  197.     _LongFunc *bios_tab;     /* pointer to the BIOS entry points */
  198.     _LongFunc *dos_tab;    /* pointer to the GEMDOS entry points */
  199.  
  200. /* media change vector */
  201.     void    (*drvchng) P_((short));
  202.  
  203. /* Debugging stuff */
  204.     void    (*trace) P_((char *, ...));
  205.     void    (*debug) P_((char *, ...));
  206.     void    (*alert) P_((char *, ...));
  207.     void    (*fatal) P_((char *, ...));
  208.  
  209. /* memory allocation functions */
  210.     void *    (*kmalloc) P_((long));
  211.     void    (*kfree) P_((void *));
  212.     void *    (*umalloc) P_((long));
  213.     void    (*ufree) P_((void *));
  214.  
  215. /* utility functions for string manipulation */
  216.     short    (*strnicmp) P_((char *, char *, _wORD));
  217.     short    (*stricmp) P_((char *, char *));
  218.     char *    (*strlwr) P_((char *));
  219.     char *    (*strupr) P_((char *));
  220.     short    (*sprintf) P_((char *, char *, ...));
  221.  
  222. /* utility functions for manipulating time */
  223.     void    (*millis_time) P_((unsigned long, _wORD *));
  224.     long    (*unixtim) P_((unsigned _wORD, unsigned _wORD));
  225.     long    (*dostim) P_((long));
  226.  
  227. /* utility functions for dealing with pauses */
  228.     void    (*nap) P_((unsigned short));
  229.     void    (*sleep) P_((_wORD que, long cond));
  230.     void    (*wake) P_((_wORD que, long cond));
  231.     void    (*wakeselect) P_((long param));
  232.  
  233. /* file system utility functions */
  234.     short    (*denyshare) P_((FILEPTR *, FILEPTR *));
  235.     LOCK *    (*denylock) P_((LOCK *, LOCK *));
  236.  
  237. /* reserved for future use */
  238.     long    res2[9];
  239. };
  240.  
  241. /* flags for open() modes */
  242. #define O_RWMODE      0x03    /* isolates file read/write mode */
  243. #    define O_RDONLY    0x00
  244. #    define O_WRONLY    0x01
  245. #    define O_RDWR    0x02
  246. #    define O_EXEC    0x03    /* execute file; used by kernel only */
  247.  
  248. #define O_APPEND    0x08    /* all writes go to end of file */
  249.  
  250. #define O_SHMODE    0x70    /* isolates file sharing mode */
  251. #    define O_COMPAT    0x00    /* compatibility mode */
  252. #    define O_DENYRW    0x10    /* deny both read and write access */
  253. #    define O_DENYW    0x20    /* deny write access to others */